// cf-r180-div2(298)-e
// 题意：给定一个n(<=10^5)个元素的独特数列S。独特数列的定义是每个元素都是
//       不相同的非负整数。现在要将其拆分成两个长度都为n的数列a, b。满足
//       Si = ai+bi。这两个数列要求几乎独特，即一个数列删除ceil(n/3)可以
//       变成独特。问是否可以拆分，如果可以任意输出一种拆分方案。
//
// 题解：一道很好的数形结合的题目。可以参考题解给出来的图。构造方法如下：
//       令d=ceil(n/3)，将原数列分成三块，[0, d), [d, 2*d), [2*d, n),
//       对于第一块，ai=i, bi=Si-ai;
//       对于第二块，bi=i, ai=Si-bi;
//       对于第三块，bi=n-1-i, ai=Si-bi;
//       也就是说肯定都有解。其实也可以理解，第一块保证ai互异，第二块保证
//       bi互异，第三块保证两者都互异，a只可能在第二块有d个相同，b只可能
//       在第一块有b个相同。
//
// run: $exec < input
#include <iostream>
#include <algorithm>

struct data { int x, id; };

bool operator<(data const & a, data const & b)
{
	return a.x < b.x;
}

int const maxn = 100007;
data da[maxn];
data a[maxn];
data b[maxn];
int n;

int main()
{
	std::ios::sync_with_stdio(false);
	std::cin >> n;
	for (int i = 0; i < n; i++) {
		std::cin >> da[i].x;
		da[i].id = i;
	}
	std::sort(da, da + n);
	for (int i = 0; i < n; i++) a[i].id = b[i].id = da[i].id;

	int d = n / 3 + ((n % 3) > 0);
	for (int i = 0; i < d; i++) {
		a[i].x = i;
		b[i].x = da[i].x - i;
	}
	for (int i = d; i < 2 * d; i++) {
		b[i].x = i;
		a[i].x = da[i].x - i;
	}
	for (int i = 2 * d; i < n; i++) {
		b[i].x = n - 1 - i;
		a[i].x = da[i].x - b[i].x;
	}
	std::cout << "YES\n";
	auto cmp = [](data const & a, data const & b) { return a.id < b.id; };
	std::sort(a, a + n, cmp);
	std::sort(b, b + n, cmp);
	for (int i = 0; i < n; i++)
		std::cout << a[i].x << ' ';
	std::cout << '\n';
	for (int i = 0; i < n; i++)
		std::cout << b[i].x << ' ';
}

